

/*
在数组名和指针之间有一个区别，
必须记住  指针是变量，故pa=a或pa++都是有意义的操作。
但        数组名是指针常量，而不是变量，因此表达式a=pa、a++、pa=&a都是非法操作。


假设指针现在指向a[0]，则数组的第i个（下标为i）元素可表示为
    a[i]或*（pa+i），
    还可使用带下标的指针pa，
    即pa[i]和*（pa+i）的含义一样。

若要将a[4]设置为123，下面语句是等效的：
    a[4]=386; *(a+4)=386; *(pa+4)=386; pa[4]=386;

在程序设计中，凡是用数组表示的均可使用指针来实现，
一个用数组和下标实现的表达式可以等价地用指针和偏移量来实现。



指针是变量
数组名是指针常量

下标     数组名     指针     指针下标     四者逻辑关系
a[0]     a         pa       pa[0]       a[0] == *a == *pa == pa[0]
a[1]     a+1       pa+1     pa[1]       a[1] == *(a+1) == *(pa+1) == pa[1]
a[2]     a+2       pa+2     pa[2]       a[2] == *(a+2) == *(pa+2) == pa[2]
...


*/

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int a[] = {1, 3, 5, 7, 9}, *p = a, i; // 相当于int *p=&a[0];
    for (i = 0; i < 5; ++i)               // 演示3种输出方式
        printf("%d %d %d ", a[i], *(a + i), *(p + i));
    printf("\n%#p,%#p\n", a, p); // 演示a即数组首地址
    for (i = 0; i < 5; i++)      // 演示指针使用下标
        printf("%d ", p[i]);
    for (; p < a + 5; ++p) // 演示从a[0]开始输出至a[4]
        printf("%d ", *p);
    for (--p; p >= a; --p) // 演示从a[4]开始输出至a[0] printf("%d ", *p);
        printf("\n");

    system("pause");
}